package com.sawgdev.android.bokuiki.activity;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
import com.sawgdev.android.bokuiki.R;

public class ActKokoikiMap extends MapActivity {

	// MapViewの利用
	private MapView mapview;

	// 地名検索クラスの宣言
	Geocoder mGeoCoder;

	// EditTextの宣言
	private EditText edittext;

	// 呼び出し元に渡す値
	private TextView textReceive;

	// 確定ボタン
	private Button btnSet;

	// 緯度
	private double lat;

	// 経度
	private double lng;

	/**
	 * 「住所確定」ボタン押下時の以下の値を返します。 ・住所 ・緯度 ・経度
	 */
	private View.OnClickListener lsnrSet = new View.OnClickListener() {
		public void onClick(View v) {
			Intent intent = new Intent(ActKokoikiMap.this, ActSetting.class);
			intent.putExtra("ADDRESS", textReceive.getText().toString());
			intent.putExtra("LATITUDE", lat);
			intent.putExtra("LONGTITUDE", lng);
			setResult(Activity.RESULT_OK, intent);
			finish();
		}
	};

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.kokoiki);

		// MapViewの取得
		mapview = (MapView) findViewById(R.id.mymapview);

		// EditTextの取得
		edittext = (EditText) findViewById(R.id.edittext);
		btnSet = (Button) findViewById(R.id.btn_set);
		textReceive = (TextView) findViewById(R.id.text);

		// 地図の初期表示時の縮尺を設定
		mapview.getController().setZoom(18);

		// ズームコントローラを配置する
		mapview.setBuiltInZoomControls(true);
		mapview.invalidate();

		btnSet.setOnClickListener(lsnrSet);
	}

	/** isRouteDisplayedメソッドを実装する */
	protected boolean isRouteDisplayed() {
		return false;
	}

	/**
	 * 「住所取得」ボタンクリック時に 地図の中心地から住所や地名を表示する
	 */
	public void onGetAddress(View view) {

		// GeoPointクラスの取得
		GeoPoint gp = mapview.getMapCenter();

		// 緯度の取得
		lat = gp.getLatitudeE6() / 1E6;

		// 経度の取得
		lng = gp.getLongitudeE6() / 1E6;

		// Geocoderを使用して住所(地名)を取得する
		StringBuffer buff = new StringBuffer();
		try {
			Geocoder geocoder = new Geocoder(this, Locale.getDefault());
			List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
			for (Address addr : addresses) {
				// 住所(地名)取得処理
				int index = addr.getMaxAddressLineIndex();
				for (int i = 1; i <= index; ++i) {
					buff.append(addr.getAddressLine(i));
				}
			}

			// 取得した住所(地名)をテキストビューに表示
			TextView tv = (TextView) findViewById(R.id.text);
			tv.setText(buff.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}

		// オーバーレイに表示する画像の設定
		Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.pin);
		AddOverlay overlay = new AddOverlay(icon, gp);

		// マップビューへオーバーレイを追加する
		MapView mapview = (MapView) findViewById(R.id.mymapview);
		List<Overlay> overlays = mapview.getOverlays();
		overlays.clear();
		overlays.add(overlay);

		// マップビューの再描画
		mapview.invalidate();
	}

	// 地図上に表示されるオーバーレイ
	private class AddOverlay extends Overlay {

		// 描画する画像
		Bitmap mImage;
		int mOffsetX;
		int mOffsetY;

		// 画像を表示する位置
		GeoPoint mPoint;
		AddOverlay(Bitmap image, GeoPoint initial) {
			mImage = image;
			mOffsetX = 0 - image.getWidth() / 2;
			mOffsetY = 0 - image.getHeight() / 2;
			mPoint = initial;
		}

		@Override
		public void draw(Canvas canvas, MapView mapView, boolean shadow) {
			super.draw(canvas, mapView, shadow);

			// 画面上の位置と地図上の位置との相互変換を行う
			Projection projection = mapView.getProjection();
			Point point = new Point();
			projection.toPixels(mPoint, point);
			point.offset(mOffsetX, mOffsetY);

			// オーバーレイへ描画する
			canvas.drawBitmap(mImage, point.x, point.y, null);
		}
	}

	/**
	 * 「目的地検索」ボタンクリック時に 住所や地名の位置情報へ地図を移動させる
	 */
	public void onGetLocation(View view) {
		Geocoder geocoder = new Geocoder(this, Locale.getDefault());
		List<Address> addressList;
		try {
			addressList = geocoder.getFromLocationName(edittext.getText()
					.toString(), 1);
			if (addressList != null && addressList.size() > 0) {
				if (addressList != null && addressList.size() > 0) {
					Address address = addressList.get(0);

					// 緯度の取得
					int lat = (int) (address.getLatitude() * 1E6);

					// 経度の取得
					int lng = (int) (address.getLongitude() * 1E6);

					// GeoPointクラスの取得
					GeoPoint gp = new GeoPoint(lat, lng);

					// Mapの中央を変更
					mapview.getController().animateTo(gp);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}